//自己
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        int left=0, right = 0;
        while (right < nums.size())//right >= nums.size()时结束跳出, left, right之间全是0
        {
            if (nums[left]==0 && nums[right]==0)//2. 多加nums[right]==0 解决了left指向0, right指向非0时, 直接跳过的问题
            {
                right++;
            }
            //else if (nums[left++]!=0 && nums[right++]!=0)//千万不能这样写, 这样没满足条件也会++
            else if (nums[left]!=0 && nums[right]!=0) 
            {
                left++;
                right++;
            }
            
          
            if (right<nums.size() && nums[left]==0 && nums[right]!=0)//1. right<nums.size()放在前面(不能让程序访问right), 解决样例[0]
            {
                swap(nums[left++], nums[right++]);
            }
        }
    }
};

//答案思路-自己
class Solution {
public:
    void moveZeroes(vector<int>& nums) {
        //用cur遍历, dest指向0前最后一个非0元素, 结束时cur指向size();  0的范围是[dest+1, cur-1]
        //刚开始不知道0前最后一个非0元素在哪? 所以先初始化成-1
        for (int dest=-1, cur=0; cur<nums.size(); cur++)
        {
            //if (nums[cur])
            if (nums[cur] != 0)
            {
                //因为dest指向0前最后一个非0元素, 所以++就指向0, 然后与刚找到的非0元素交换
                swap(nums[++dest], nums[cur]);
            }
        }
    }
};